JZedit har nu en inbyggd virtuell terminal

Terminal i editorn

Ett av målen med min online editor är att du inte ska behöva skriva kommandon i terminalen/konsolen.
Men när jag implementerade stöd för versionshantering via versions-hanterings-programmet Mercurial insåg jag att det vore bra att i alla fall ha möjligheten att skriva mercurial-kommandon i en terminal.
Mercurial har stöd för så många arbetssätt att det blir för mycket jobb och för komplicerat att implimentera allt i ett grafiskt gränssnitt.

Terminalen i min editor kör bash shell och det går just nu bara att använda programmen hg (Mercurial) och nodejs.
Den använder ALT i stället för CTRL för att skicka kontroll-koder, alltså ALT+C i stället för CTRL+C - då CTRL+C redan är upptaget för att kopiera text.

Du kan testa terminalen här nedan: (Min editor inbäddad i hemsidan)

Terminal och bash shell

Terminalens historia går tillbaka till 70-talet och standarden är i stort sett densamma nu som då.

Nu för tiden kopplar man både tangentbord och skräm direkt i datorn, men på många datorer förr i tiden var terminalen (tangentbord och skärm) en separat enhet och kallades för "terminal".
Många populära program, till exempel vim och emacs (populära text-editors) är anpassade för att användas via en terminal.
Och för att kunna köra dessa program måste man ha en virtuell terminal.

Om man inte använder ett program för att knappa in kod är det vanligt att man använder ett shell-program / kommando-prompt.
Det populäraste shell-prgrammet heter bash.
Med bash kan man använda så kallade rör (Engelska: pipes) | för att skicka data mellan olika program. Eller pilar för skicka data till en fil i stället för skärmen.

Exempel på bash-kommandon

Visa hej på skärmen:

Spara hej i en fil:

Lägg till en ny rad i en fil:

Visa en fils innehåll:

Köra ett script:

Bash är ett i sig ett programmerings-språk. Och man kan spara ner många bash-kommandon i ett så kallat bash-script.
Filosofin med bash är att ha många specialiserade program som tar in-data (Engelska: input) och ger ut-data (Engelska: output). Och sedan koppla samman dem med "rör" för att strömma data mellan dem.

Bash är populärt bland utvecklare och systemadministratörer, men på senare tid har andra script-baserade språk tagit över, så som Perl, Python, och JavaScript/NodeJS - som kan göra allt som bash kan plus mycket mer och är dessutom enklare att programmera.
Min editor specialiserar sig på just JavaScript/NodeJS!

Implementation

För att "lura" shell-programmet bash att det pratar med en terminal använder jag Node-JS modulen pty.js. pty.js pratar med kernel - operativsystemets kärna och "fejkar" att den är en terminal.

Operativsystemet och terminalen kommunicerar via så kallade "ANSI"-koder. Vilket är en standard för kommunikation mellan terminalen och datorn.
När ett terminal-baserat program till exempel vill att terminalen ska flytta mörkören upp ett steg skickar den ESC + A. Om den vill att terminalen flyttar markören 7 steg till höger skickar den ESC + 7 + C. För att tala om för programmet att till exempel infoga bokstaven A skickar man helt enkelt tecknet A.
Så det är enkelt att skicka data från terminalen, men lite svårade att tyda vad programmet vill att terminalen ska göra.
Jag hittade referenser för många ANSI-koder på nätet, men fick implementera en hel del genom "trail and error". Till exempel köra kommandot i xterm (en populär virtuell terminal) och se vad som hände där, och sedan få min editor att tyda ANSI-koderna och göra samma sak.

För kuls skull provade jag köra nano (en terminal-baserad text edtior) via terminalen i min editor. Och det funkar! Så om du inte gillar hur min editor fungerar, så kan du via den virtuella terminalaen starta upp en editor i editorn!



Blogginlägg skrivet av Johan Zetterberg


Följ mig via RSS:   RSS https://zäta.com/rss.xml (ange adressen i din feed-läsare)